﻿#region License
// Copyright (c) 2012 Mund Consulting Ltd
//
// Permission is hereby granted, free of charge, to any person
// obtaining a copy of this software and associated documentation
// files (the "Software"), to deal in the Software without
// restriction, including without limitation the rights to use,
// copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the
// Software is furnished to do so, subject to the following
// conditions:
//
// The above copyright notice and this permission notice shall be
// included in all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
// OTHER DEALINGS IN THE SOFTWARE.
#endregion
using System;
using Microsoft.SharePoint;
using Microsoft.SharePoint.WebControls;
using System.Web.UI.WebControls;
using Microsoft.SharePoint.Utilities;

namespace SharePoint.Foundation.Publishing
{
    /// <summary>
    /// It enables to change master page and css of this site and its immediate sub site
    /// </summary>
    public partial class ChangeMasterPage : LayoutsPageBase
    {
        const string constMasterPageCatalogPath = "/_catalogs/Masterpage/";
        const string constServerRelativeRootWeb = "/";

        protected void Page_Load(object sender, EventArgs e)
        {
            SPSite curSite = SPContext.Current.Site;
            SPWeb curWeb = SPContext.Current.Web;
            if (curWeb.IsRootWeb == true)
            {
                rdbInheritMaster.Enabled = false;
                rdbAltParentCss.Enabled = false;
                rdbSelectMaster.Checked = true;
                rdbMSfDefaultCss.Checked = true;
            }
            else
            {
                rdbInheritMaster.Enabled = true;
                rdbAltParentCss.Enabled = true;
                rdbSelectMaster.Checked = true;
                rdbMSfDefaultCss.Checked = true;
            }

            if (!IsPostBack)
            {
                SPList masterList = curWeb.GetCatalog(SPListTemplateType.MasterPageCatalog);
                string managedPath = string.Empty;
                if (curWeb.ServerRelativeUrl != constServerRelativeRootWeb)
                    managedPath = curWeb.ServerRelativeUrl;
                SPField fiFile = GetFileField(masterList);
                foreach (SPListItem item in masterList.Items)
                {
                    string itName = item[fiFile.Id].ToString();
                    if (itName.IndexOf(".master") != -1)
                    {                    
                        ddlMasterPages.Items.Add(new ListItem(item.File.Name, item.File.Name));
                    
                        if (curWeb.MasterUrl.ToUpper() == (managedPath+"/" + item.File.Url).ToUpper())
                        ddlMasterPages.SelectedIndex = ddlMasterPages.Items.Count - 1;
                    }
                }
            }
        }

        protected void SaveSettings(object sender, EventArgs e)
        {
            SPWeb webMasterPage = SPContext.GetContext(this.Context).Site.RootWeb; ;
            SPWeb webRef = SPContext.GetContext(this.Context).Web;

            string webPathMasterUrl = GetFullPath(webMasterPage);
            string webPathUrl = GetFullPath(webRef);

            string URLmaster = webPathMasterUrl + "_catalogs/masterpage/" + this.ddlMasterPages.SelectedValue;

            updateMasterWeb(webRef, URLmaster);
            
            Response.Redirect(webPathUrl + "_layouts/15/spfpub/ChangeMasterPage.aspx?source=" + webPathUrl + "_layouts/settings.aspx");
        }

        //protected void SaveSetxtings(object sender, EventArgs e)
        //{
        //    SPSite curSite = SPContext.Current.Site;
        //    SPWeb curWeb = SPContext.Current.Web;
        //    string serverRelativeMaster = curWeb.ServerRelativeUrl + constMasterPageCatalogPath;
        //    string catalog = string.Empty;
        //    if (curWeb.ServerRelativeUrl != constServerRelativeRootWeb)
        //    {
        //        catalog = serverRelativeMaster;
        //    }
        //    else
        //    {
        //        catalog = constMasterPageCatalogPath;
        //    }


        //    /* Master Page Settings */

        //    if (rdbSelectMaster.Checked)
        //    {
        //        curWeb.MasterUrl = catalog + ddlMasterPages.SelectedValue;

        //    }
        //    if (rdbInheritMaster.Checked)
        //    {
        //        curWeb.MasterUrl = curWeb.ParentWeb.MasterUrl;
        //    }

        //    // when checked only immediate subsite masterpage setting changes
        //    //if (chbxResetMasterPage.Checked)
        //    //{
        //    //    foreach (SPWeb web in curWeb.Webs)
        //    //    {
        //    //        web.CustomMasterUrl = web.ParentWeb.CustomMasterUrl;
        //    //        web.Update();
        //    //    }
        //    //}

        //    /* CSS Settings */

        //    if (rdbSelectCss.Checked)
        //    {
        //        curWeb.AlternateCssUrl = tbxCssUrl.Text;
        //    }
        //    if (rdbAltParentCss.Checked)
        //    {
        //        curWeb.AlternateCssUrl = curWeb.ParentWeb.AlternateCssUrl;
        //    }

        //    // when checked only immediate subsite CSS Setting changes
        //    //if (chbxResetCss.Checked)
        //    //{
        //    //    foreach (SPWeb web in curWeb.Webs)
        //    //    {
        //    //        web.AlternateCssUrl = web.ParentWeb.AlternateCssUrl;
        //    //        web.Update();
        //    //    }
        //    //}
        //    curWeb.Update();
        //}

        protected void DoCancel(object sender, EventArgs e)
        {
            SPUtility.Redirect(string.Empty, SPRedirectFlags.UseSource, Context);
        }

        /// <summary>
        /// Get the SPfield for the master gallery
        /// </summary>
        /// <param name="plist"></param>
        /// <returns></returns>
        private SPField GetFileField(SPList plist)
        {
            SPFieldCollection FiColl = plist.Fields;
            return FiColl.GetFieldByInternalName("FileLeafRef");
        }
       

        /// <summary>
        /// get the ful relative URL from the SPweb
        /// </summary>
        /// <param name="webRef"></param>
        /// <returns></returns>
        private string GetFullPath(SPWeb webRef)
        {
            string webPathUrl = webRef.ServerRelativeUrl;
            if (webPathUrl[webPathUrl.Length - 1] != '/')
                webPathUrl += "/";

            return webPathUrl;
        }

        private void updateMasterWeb(SPWeb web, string masterUrl)
        {
            web.MasterUrl = masterUrl;
            web.Update();

            foreach (SPWeb subweb in web.GetSubwebsForCurrentUser())
            {
                updateMasterWeb(subweb, masterUrl);
            }
            web.Dispose();
        }
    }
}
